const Router = require('koa-router');
const path = require('path');
const common = require('./common');

module.exports = function (fields, table, page_type) {
    const router = new Router();
    // 页面集合mapping
    const page_types = {
        'banner': 'banner管理',
        'catalog': '类目管理',
        'article': '文章管理'
    }

    router.get('/', async ctx => {
        let { HTTP_ROOT } = ctx.config;
        let datas = await ctx.db.query(`select * from ${table}`);
        await ctx.render('admin/table', {
            HTTP_ROOT,                              // localhost:8080
            page_type,
            page_types,
            datas,                                  // 数据库中的数据
            fields                                  // 需要增加表单字段
        })
    })

    // 处理提交数据(普通表单, 文件上传)
    // 根据配置的提交字段进行提交,达到可配置
    router.post('/', async ctx => {
        let { HTTP_ROOT } = ctx.config;
        let post = ctx.request.fields;
        let keys = [];
        let vals = [];
        fields.forEach(({ name, type }) => {
            keys.push(name);
            if (type == 'file') {
                vals.push(path.basename(post[name][0].path));
            } else {
                vals.push(post[name]);
            }
        })
        let sql = `insert into ${table} (${keys.join(',')}) values(${keys.map(key => '?')})`;
        await ctx.db.query(sql, vals);
        ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`);
    })

    // 删除某一条记录(删除包含 删除上传文件 和 数据库记录(普通表单))
    router.get('/delete/:id', async ctx => {
        let { id } = ctx.params;
        // 获取上传目录(从config)
        let { UPLOAD_DIR, HTTP_ROOT } = ctx.config;
        // 从db中根据id获取记录的信息,然后删除记录和文件
        let data = await ctx.db.query(`select * from ${table} where ID = ?`, [id]);
        ctx.assert(data.length, 400, 'no data');
        let row = data[0];
        // 直接把fields中的每一项field 解构出 name和type属性
        fields.forEach(async ({ name, type }) => {
            if (type == 'file') {
                // 删除文件
                await common.unlink(path.resolve(UPLOAD_DIR, row[name]));
            }
        })
        await ctx.db.query(`delete from ${table} where id = ?`, [id]);
        ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`);
    })

    // 通过请求接口
    router.get(`/get/:id`, async ctx => {
        let { id } = ctx.params;
        let rows = await ctx.db.query(`select * from ${table} where id = ?`, [id]);
        if (rows.length == 0) {
            ctx.body = { err: 1, msg: 'no this data' };
        } else {
            ctx.body = { err: 0, msg: 'success', data: rows[0] };
        }
    })

    router.post('/modify/:id', async ctx => {
        // 1. 获取原来的数据
        // 2. 获取需要更新的字段
        // 3. 拼接sql
        // 4. 判断需要更新字段的类型, 如果是file类型需要单独处理
        let { id } = ctx.params;
        let { HTTP_ROOT, UPLOAD_DIR } = ctx.config;
        let data = await ctx.db.query(`select * from ${table} where id = ?`, [id]);
        // 获取提交表单数据
        let post = ctx.request.fields;
        // 存储需要删除的附件路径
        let filepaths = {};
        // 获取表单元素是文件的文件名, 用于修改(上传新的附件)时, 把原来的附件删除, 附件可能是多个, 所以使用对象来存储
        fields.forEach(({ name, type }) => {
            if (type == 'file') {
                filepaths[name] = data[0][name];
            }
        });
        // 存储需要更新的字段名称和提交的值, 形成一个数组, 便于拼接sql
        let keys = [];
        let vals = [];
        let file_change = {};
        fields.forEach(async ({ name, type }) => {
            if (type == 'file') {
                if (post[name] && post[name].length && post[name][0].size) {
                    file_change[name] = true;
                    keys.push(name);
                    vals.push(path.basename(post[name][0].path));
                }
            } else {
                keys.push(name);
                vals.push(post[name]);
            }
        });
        // 修改更新数据库
        let sql = `update ${table} set ${keys.map(key => `${key} = ?`).join(',')} where id = ?`;
        await ctx.db.query(sql, [...vals, id]);

        console.log(filepaths);
        // 修改删除原有的文件
        fields.forEach(async ({ name, type }) => {
            if (type == 'file' && file_change[name]) {
                await common.unlink(path.resolve(UPLOAD_DIR, filepaths[name]));
            }
        })
        ctx.redirect(`${HTTP_ROOT}/admin/${page_type}`);
    })
    return router.routes();
}
